home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #3 / Amiga Plus CD - 1997 - No. 03.iso / pd / programmierung / alienbreed3d2_src / cheesesauce / andy.lha / ObjectMove < prev    next >
Text File  |  1995-09-15  |  30KB  |  2,152 lines

  1. extlen: dc.w 0
  2. awayfromwall: dc.w 0
  3. wallbounce: dc.w 0
  4. wallxsize: dc.w 0
  5. wallzsize: dc.w 0
  6. walllength: dc.w 0
  7.  
  8. RoomPath: ds.w 100
  9. RoomPathPtr: dc.l 0
  10. QUITOUT: dc.w 0
  11.  
  12. MoveObject:
  13.  
  14.  move.l #objroom,objroomback
  15.  move.w #200,QUITOUT
  16.  
  17.  move.l #RoomPath,RoomPathPtr
  18.  
  19.  clr.b hitwall
  20.  
  21.  move.w newx,d0
  22.  sub.w oldx,d0
  23.  move.w d0,xdiff
  24.  move.w newz,d0
  25.  sub.w oldz,d0
  26.  move.w d0,zdiff
  27.  tst.w xdiff
  28.  bne.s .moveing
  29.  tst.w zdiff
  30.  bne.s .moveing
  31.  rts
  32.  
  33. .moveing:
  34.  
  35.  move.l newy,wallhitheight
  36.  move.l objroom,a0
  37.  
  38. gobackanddoitallagain:
  39.  
  40.  move.l a0,a5
  41.  adda.w ToExitList(a5),a0
  42.  move.l a0,test
  43.  move.l FloorLines,a1
  44. checkwalls:
  45.  move.w (a0)+,d0
  46.  blt nomorewalls
  47.  
  48.  asl.w #4,d0
  49.  lea (a1,d0.w),a2
  50.  
  51. *********************************
  52. * Check if we are within exit limits
  53. * of zone.
  54. *********************************
  55.  
  56.  move.l #-65536*256,d0
  57.  move.l d0,LowerRoofHeight
  58.  move.l d0,UpperRoofHeight
  59.  move.l d0,LowerFloorHeight
  60.  move.l d0,UpperFloorHeight
  61.  
  62. ; tst.b 9(a2)
  63. ; bne thisisawall2
  64.  
  65.  moveq #0,d1
  66.  move.w 8(a2),d1
  67.  blt thisisawall2
  68.  move.l ZoneAdds,a4
  69.  move.l (a4,d1.w*4),a4
  70.  add.l LEVELDATA,a4
  71.  
  72.  move.l ToZoneFloor(a4),d1
  73.  move.l d1,LowerFloorHeight
  74.  move.l ToZoneRoof(a4),d2
  75.  move.l d2,LowerRoofHeight
  76.  
  77.  bra thisisawall1
  78.  
  79.  sub.l d2,d1
  80.  cmp.l thingheight,d1
  81.  ble thisisawall1
  82.  
  83.  move.l oldy,d0
  84.  move.l d0,d1
  85.  add.l thingheight,d1
  86.  sub.l ToZoneFloor(a4),d1
  87.  bgt.s chkstepup
  88.  
  89.  neg.l d1
  90.  cmp.l StepDownVal,d1
  91.  blt.s botinsidebot
  92.  
  93. chkstepup:
  94.  cmp.l StepUpVal,d1
  95.  blt.s botinsidebot
  96.  
  97. ; We have a wall!
  98.  bra thisisawall1
  99.  
  100. botinsidebot:
  101.  
  102.  sub.l ToZoneRoof(a4),d0
  103.  blt.s thisisawall1
  104.  
  105.  bra checkwalls
  106.  
  107. thisisawall1:
  108.  
  109.  move.l ToUpperFloor(a4),d1
  110.  move.l d1,UpperFloorHeight
  111.  move.l ToUpperRoof(a4),d2
  112.  sub.l d2,d1
  113.  move.l d2,UpperRoofHeight
  114.  
  115.  bra thisisawall2
  116.  
  117.  cmp.l thingheight,d1
  118.  ble thisisawall2
  119.  
  120.  move.l oldy,d0
  121.  move.l d0,d1
  122.  add.l thingheight,d1
  123.  sub.l ToUpperFloor(a4),d1
  124.  bgt.s chkstepup2
  125.  
  126.  neg.l d1
  127.  cmp.l StepDownVal,d1
  128.  blt.s botinsidebot2
  129.  bra.s thisisawall2
  130.  
  131. chkstepup2:
  132.  cmp.l StepUpVal,d1
  133.  blt.s botinsidebot2
  134.  
  135. ; We have a wall!
  136.  bra thisisawall2
  137.  
  138. botinsidebot2:
  139.  
  140.  sub.l ToUpperRoof(a4),d0
  141.  blt.s thisisawall2
  142.  
  143.  bra checkwalls
  144. thisisawall2
  145.  
  146.  move.l #0,a4
  147.  move.l #0,a6
  148.  move.b awayfromwall,d3
  149.  blt.s .notomatoes
  150.  
  151.  move.b 12(a2),d2
  152.  ext.w d2
  153.  
  154.  move.b 13(a2),d4
  155.  ext.w d4
  156.  
  157.  tst.b d3
  158.  beq.s .noshift
  159.  asl.w d3,d2
  160.  asl.w d3,d4
  161. .noshift
  162.  
  163.  move.w d2,a4
  164.  move.w d4,a6
  165.  
  166. .notomatoes:
  167.  
  168.  move.w newx,d0
  169.  move.w newz,d1
  170.  sub.w (a2),d0
  171.  sub.w 2(a2),d1
  172.  sub.w a4,d0
  173.  sub.w a6,d1
  174.  
  175.  move.w 4(a2),d2
  176.  sub.w a4,d2
  177.  sub.w a6,d2
  178.  
  179.  muls d2,d1
  180.  
  181.  move.w 6(a2),d5
  182.  add.w a4,d5
  183.  sub.w a6,d5
  184.  
  185.  muls d5,d0
  186.  sub.l d1,d0
  187.  ble chkhttt
  188.  
  189.  move.w 10(a2),d3
  190.  add.w extlen,d3
  191.  divs d3,d0
  192.  cmp.w #32,d0
  193.  bge oknothitwall
  194.  
  195.  move.w wallflags(pc),d0
  196.  or.w d0,14(a2) 
  197.  
  198.  bra oknothitwall
  199.  
  200. chkhttt:
  201.  
  202.  move.w d2,WALLXLEN
  203.  move.w d5,WALLZLEN
  204.  
  205.  move.l d0,d7
  206.  
  207.  move.w 10(a2),d3
  208.  add.w extlen,d3
  209.  divs d3,d7    ;  d
  210.  
  211.  move.l newy,d4
  212.  sub.l oldy,d4
  213. ; beq .dontworryhit
  214.  
  215.  move.w oldx,d0
  216.  move.w oldz,d1
  217.  sub.w (a2),d0
  218.  sub.w 2(a2),d1
  219.  sub.w a4,d0
  220.  sub.w a6,d1
  221.  
  222.  muls d2,d1
  223.  muls d5,d0
  224.  sub.l d1,d0
  225.  divs d3,d0    ; otherd
  226.  
  227.  sub.w d7,d0    ; total distance travelled across wall
  228.  bgt.s .ohbugger
  229.  moveq #1,d0
  230. .ohbugger:
  231.  
  232. ; We now have ratio to multiply x,z and y differences
  233. ; by. Check y=0 since that's quite common.
  234.  
  235.  move.l d4,d1
  236.  beq.s .dontworryhit
  237.  
  238.  divs d0,d1
  239.  muls d7,d1
  240. .dontworryhit:
  241.  add.l newy,d1 ; height at point of crossing wall.
  242.  move.l d1,d6
  243.  add.l thingheight,d6
  244.  sub.l StepUpVal,d6
  245.  
  246.  cmp.l LowerFloorHeight,d6
  247.  bge.s .yeshit
  248.  cmp.l LowerRoofHeight,d1
  249.  bgt oknothitwall
  250.  cmp.l UpperRoofHeight,d1
  251.  blt.s .yeshit
  252.  cmp.l UpperFloorHeight,d6
  253.  blt oknothitwall
  254.  
  255. .yeshit:
  256.  
  257.  move.l d1,wallhitheight
  258.  
  259.  tst.b wallbounce
  260.  bne.s .calcbounce
  261.  
  262.  tst.b exitfirst(pc)
  263.  beq.s .calcalong
  264.  bne.s .calcwherehit
  265.  
  266. .calcbounce:
  267.  
  268. ; For simplicity (possibility!) the
  269. ; bounce routine will:
  270. ; Place the object at wall contact
  271. ; point
  272. ; Supply wall data to reflect the
  273. ; movement direction of the object
  274.  
  275.  move.w d2,wallxsize
  276.  move.w d5,wallzsize
  277.  move.w d3,walllength
  278.  
  279. .calcwherehit:
  280.  
  281. ; add.w #20,d7
  282.  move.w newx,d6
  283.  sub.w oldx,d6
  284.  muls d7,d6
  285.  divs d0,d6
  286.  add.w newx,d6
  287.  
  288.  move.w newz,d1
  289.  sub.w oldz,d1
  290.  muls d7,d1
  291.  divs d0,d1
  292.  add.w newz,d1
  293.  move.w d6,d0
  294.  move.w d1,d7
  295.  bra.s .calcedhit
  296.  
  297. .calcalong:
  298.  
  299. ; sub.w #3,d7
  300.  move.w d7,d6
  301.  muls d5,d6
  302.  muls d2,d7
  303.  divs d3,d6
  304.  divs d3,d7
  305.  neg.w d6
  306.  add.w newx,d6    ; point on wall
  307.  add.w newz,d7
  308.  
  309.  move.w d6,d0
  310.  move.w d7,d1
  311.  bra.s othercheck
  312.  
  313. .calcedhit:
  314.  
  315.  move.w newx,d6
  316.  move.w newz,d7
  317.  sub.w oldx,d6
  318.  sub.w oldz,d7
  319.   
  320.  move.w (a2),d4
  321.  add.w a4,d4
  322.  sub.w oldx,d4
  323.  muls d4,d7; negative if on left
  324.  move.w 2(a2),d4
  325.  add.w a6,d4
  326.  sub.w oldz,d4
  327.  muls d4,d6
  328.  sub.l d6,d7
  329.  bgt oknothitwall
  330.  
  331.  move.w d0,d6
  332.  move.w d1,d7
  333.  move.w newx,d6
  334.  move.w newz,d7
  335.  sub.w oldx,d6
  336.  sub.w oldz,d7
  337.  
  338.  move.w (a2),d4
  339.  add.w a4,d4
  340.  add.w d2,d4
  341.  sub.w oldx,d4
  342.  muls d4,d7; negative if on left
  343.  move.w 2(a2),d4
  344.  add.w a6,d4
  345.  add.w d5,d4
  346.  sub.w oldz,d4
  347.  muls d4,d6
  348.  sub.l d6,d7
  349.  blt oknothitwall
  350.  bra hitthewall
  351.  
  352.  
  353. othercheck:
  354.  
  355. ; sub.w (a2),d6
  356. ; sub.w 2(a2),d7
  357. ; sub.w a4,d6
  358. ; sub.w a6,d7
  359. ; muls d6,d6
  360. ; muls d7,d7
  361. ; add.w #5,d3
  362. ; muls d3,d3
  363. ; add.l d6,d7
  364. ; cmp.l d3,d7
  365. ; bgt oknothitwall
  366. ; move.w d1,d7
  367. ; move.w d0,d6
  368. ; sub.w (a2),d6
  369. ; sub.w 2(a2),d7
  370. ; sub.w d2,d6
  371. ; sub.w d5,d7
  372. ; muls d6,d6
  373. ; muls d7,d7
  374. ; add.l d6,d7
  375. ; cmp.l d3,d7
  376. ; bgt oknothitwall
  377. ;************8 
  378.  
  379.  sub.w (a2),d6
  380.  sub.w 2(a2),d7
  381.  
  382.  sub.w a4,d6
  383.  sub.w a6,d7
  384.  move.w d2,d4
  385.  bge.s okplus1
  386.  neg.w d4
  387. okplus1
  388.  move.w d5,d3
  389.  bge.s okplus2
  390.  neg.w d3
  391. okplus2:
  392.  cmp.w d4,d3
  393.  bgt.s UseZ
  394.  
  395. ; Use the x coord!
  396.  
  397.  tst.w d6
  398.  bgt.s xispos
  399.  
  400.  move.w d2,d7
  401.  cmp.w #4,d7
  402.  bgt.s oknothitwall
  403.  sub.w #4,d7
  404.  cmp.w d7,d6
  405.  blt.s oknothitwall
  406.  
  407.  bra.s hitthewall
  408.  
  409. xispos:
  410.  
  411.  move.w d2,d7
  412.  cmp.w #-4,d7
  413.  blt.s oknothitwall
  414.  add.w #4,d7
  415.  cmp.w d7,d6
  416.  bgt.s oknothitwall
  417.  
  418.  bra.s hitthewall
  419.  
  420. UseZ:
  421.  tst.w d7
  422.  bgt.s zispos
  423.  
  424.  move.w d5,d6
  425.  cmp.w #4,d6
  426.  bgt.s oknothitwall
  427.  sub.w #4,d6
  428.  cmp.w d6,d7
  429.  blt.s oknothitwall
  430.  
  431.  bra.s hitthewall
  432.  
  433. zispos:
  434.  
  435.  move.w d5,d6
  436.  cmp.w #-4,d6
  437.  blt.s oknothitwall
  438.  add.w #4,d6
  439.  cmp.w d6,d7
  440.  bgt.s oknothitwall 
  441.  
  442. hitthewall:
  443.  
  444.  move.w d0,newx
  445.  move.w d1,newz
  446.  move.w wallflags(pc),d0
  447.  or.w d0,14(a2)
  448.  st hitwall
  449.  tst.b exitfirst(pc)
  450.  bne stopandleave
  451.  
  452. oknothitwall:
  453.  
  454.  bra checkwalls
  455. nomorewalls:
  456.  
  457.  tst.w extlen
  458.  beq NOOTHERWALLSNEEDED
  459.  
  460.  tst.w xdiff
  461.  bne.s notstill
  462.  tst.w zdiff
  463.  bne.s notstill
  464.  move.l objroom,a0
  465.  bra mustbeinsameroom
  466. notstill:
  467.  
  468.  move.l a5,a0
  469.  add.w ToExitList(a0),a0
  470.  
  471. checkotherwalls:
  472.  move.w (a0)+,d0
  473.  bge anotherwalls
  474.  cmp.w #-2,d0
  475.  beq nomoreotherwalls
  476.  bra checkotherwalls
  477.  
  478. anotherwalls:
  479.  
  480.  asl.w #4,d0
  481.  lea (a1,d0.w),a2
  482.  
  483. *********************************
  484. * Check if we are within exit limits
  485. * of zone.
  486. *********************************
  487.  
  488. ; tst.b 9(a2)
  489. ; bne .thisisawall2
  490.  
  491.  moveq #0,d1
  492.  move.w 8(a2),d1
  493.  blt .thisisawall2
  494.  move.l ZoneAdds,a4
  495.  move.l (a4,d1.w*4),a4
  496.  add.l LEVELDATA,a4
  497.  
  498.  move.l ToZoneFloor(a4),d1
  499.  sub.l ToZoneRoof(a4),d1
  500.  cmp.l thingheight,d1
  501.  ble .thisisawall1
  502.  
  503.  move.l newy,d0
  504.  move.l d0,d1
  505.  add.l thingheight,d1
  506.  sub.l ToZoneFloor(a4),d1
  507.  bgt.s .chkstepup
  508.  
  509.  neg.l d1
  510.  cmp.l StepDownVal,d1
  511.  blt.s .botinsidebot
  512.  bra.s .thisisawall1
  513.  
  514. .chkstepup:
  515.  
  516.  cmp.l StepUpVal,d1
  517.  blt.s .botinsidebot
  518.  
  519. ; We have a wall!
  520.  bra .thisisawall1
  521.  
  522. .botinsidebot:
  523.  
  524.  sub.l ToZoneRoof(a4),d0
  525.  blt.s .thisisawall1
  526.  
  527.  bra checkotherwalls
  528.  
  529. .thisisawall1:
  530.  
  531.  move.l ToUpperFloor(a4),d1
  532.  sub.l ToUpperRoof(a4),d1
  533.  cmp.l thingheight,d1
  534.  ble .thisisawall2
  535.  
  536.  move.l newy,d0
  537.  move.l d0,d1
  538.  add.l thingheight,d1
  539.  sub.l ToUpperFloor(a4),d1
  540.  bgt.s .chkstepup2
  541.  
  542.  neg.l d1
  543.  cmp.l StepDownVal,d1
  544.  blt.s .botinsidebot2
  545.  bra.s .thisisawall2
  546.  
  547. .chkstepup2:
  548.  
  549.  cmp.l StepUpVal,d1
  550.  blt.s .botinsidebot2
  551.  
  552. ; We have a wall!
  553.  bra .thisisawall2
  554.  
  555. .botinsidebot2:
  556.  
  557.  sub.l ToUpperRoof(a4),d0
  558.  blt.s .thisisawall2
  559.  
  560.  bra checkotherwalls
  561.  
  562. .thisisawall2:
  563.  
  564.  move.l #0,a4
  565.  move.l #0,a6
  566.  move.b awayfromwall,d3
  567.  blt.s .notomatoes
  568.  
  569.  move.b 12(a2),d2
  570.  ext.w d2
  571.  
  572.  move.b 13(a2),d4
  573.  ext.w d4
  574.  
  575.  tst.b d3
  576.  beq.s .noshift
  577.  asl.w d3,d2
  578.  asl.w d3,d4
  579. .noshift
  580.  
  581.  move.w d2,a4
  582.  move.w d4,a6
  583.  
  584. .notomatoes:
  585.  
  586.  move.w 4(a2),d2
  587.  sub.w a4,d2
  588.  sub.w a6,d2
  589.  move.w d2,DX
  590.  move.w 6(a2),d5
  591.  add.w a4,d5
  592.  sub.w a6,d5
  593.  
  594.  
  595.  move.w newx,d0
  596.  move.w newz,d1
  597.  sub.w (a2),d0
  598.  sub.w 2(a2),d1
  599.  sub.w a4,d0
  600.  sub.w a6,d1
  601.  muls DX,d1
  602.  muls d5,d0
  603.  sub.l d1,d0
  604.  bge .oknothitwall
  605.  move.l d0,d7
  606.  
  607.  move.w oldx,d1
  608.  move.w newx,d3
  609.  sub.w d1,d3
  610.  sub.w (a2),d1
  611.  sub.w a4,d1 ;e-a=d1
  612.  
  613.  move.w 2(a2),d2
  614.  add.w a6,d2
  615.  sub.w oldz,d2    ;b-f=d2
  616.  
  617.  move.w newz,d4
  618.  sub.w oldz,d4
  619.  
  620.  muls d4,d1
  621.  muls d3,d2
  622.  add.l d2,d1    ; h(e-a)+g(b-f)
  623.  
  624.  muls DX,d4
  625.  muls d5,d3
  626.  sub.l d3,d4
  627.  beq .oknothitwall
  628.  bgt.s .botpos
  629. .botneg:
  630.  tst.l d1
  631.  bgt .oknothitwall
  632.  cmp.l d1,d4
  633.  ble .mighthit
  634.  bra .oknothitwall
  635.  
  636. .botpos:
  637.  tst.l d1
  638.  blt .oknothitwall
  639.  cmp.l d1,d4
  640.  blt .oknothitwall
  641.  
  642. .mighthit:
  643.  
  644.  move.w 10(a2),d0
  645.  add.w extlen,d0
  646.  divs d0,d7    ;  d
  647.  sub.w #3,d7
  648.  move.w d7,d6
  649.  muls d5,d6
  650.  muls DX,d7
  651.  divs d0,d6
  652.  divs d0,d7
  653.  neg.w d6
  654.  add.w newx,d6    ; point on wall
  655.  add.w newz,d7
  656.  
  657.  move.w oldx,d0
  658.  move.w oldz,d1
  659.  sub.w (a2),d0
  660.  sub.w 2(a2),d1
  661.  sub.w a4,d0
  662.  sub.w a6,d1
  663.  muls DX,d1
  664.  muls d5,d0
  665.  sub.l d1,d0
  666.  blt .oknothitwall
  667.  
  668.  move.w d6,d0
  669.  move.w d7,d1
  670.  
  671.  bra .hitthewall
  672.  
  673.  sub.w (a2),d6
  674.  sub.w 2(a2),d7
  675.  move.w d6,d4
  676.  bge.s .okplus1
  677.  neg.w d4
  678. .okplus1
  679.  move.w d7,d3
  680.  bge.s .okplus2
  681.  neg.w d3
  682. .okplus2:
  683.  cmp.w d4,d3
  684.  bgt.s .UseZ
  685.  
  686. ; Use the x coord!
  687.  
  688.  tst.w d6
  689.  bgt.s .xispos
  690.  
  691.  move.w DX,d7
  692.  bgt.s .oknothitwall
  693.  cmp.w d7,d6
  694.  blt.s .oknothitwall
  695.  
  696.  bra.s .hitthewall
  697.  
  698. .xispos:
  699.  
  700.  move.w DX,d7
  701.  blt.s .oknothitwall
  702.  cmp.w d7,d6
  703.  bgt.s .oknothitwall
  704.  
  705.  bra.s .hitthewall
  706.  
  707. .UseZ:
  708.  tst.w d7
  709.  bgt.s .zispos
  710.  
  711.  move.w d5,d6
  712.  bgt.s .oknothitwall
  713.  cmp.w d6,d7
  714.  blt.s .oknothitwall
  715.  
  716.  bra.s .hitthewall
  717.  
  718. .zispos:
  719.  
  720.  move.w d5,d6
  721.  blt.s .oknothitwall
  722.  cmp.w d6,d7
  723.  bgt.s .oknothitwall
  724.  
  725.  
  726. .hitthewall:
  727.  
  728.  move.w d0,newx
  729.  move.w d1,newz
  730.  move.w wallflags(pc),d0
  731.  or.w d0,14(a2)
  732.  st hitwall
  733.  tst.b exitfirst(pc)
  734.  bne stopandleave
  735.  
  736. .oknothitwall:
  737.  
  738.  bra checkotherwalls
  739. nomoreotherwalls:
  740.  
  741. NOOTHERWALLSNEEDED
  742.  
  743.  
  744. ; move.w xdiff,d2
  745. ; muls d2,d2
  746. ; move.w zdiff,d3
  747. ; muls d3,d3
  748. ; move.w #0,movespd
  749. ; move.l #0,largespd
  750. ; add.l d3,d2
  751. ;
  752. ; move.w #31,d0
  753. ;.findhigh
  754. ; btst d0,d2
  755. ; bne .foundhigh
  756. ; dbra d0,.findhigh
  757. ;.foundhigh
  758. ; asr.w #1,d0
  759. ; clr.l d3
  760. ; bset d0,d3
  761. ; move.l d3,d0
  762. ;
  763. ; move.w d0,d3
  764. ; muls d3,d3    ; x*x
  765. ; sub.l d2,d3    ; x*x-a
  766. ; asr.l #1,d3    ; (x*x-a)/2
  767. ; divs d0,d3    ; (x*x-a)/2x
  768. ; sub.w d3,d0    ; second approx
  769. ; bgt .stillnot0
  770. ; move.w #1,d0
  771. ;.stillnot0
  772. ;
  773. ; move.w d0,d3
  774. ; muls d3,d3
  775. ; sub.l d2,d3
  776. ; asr.l #1,d3
  777. ; divs d0,d3
  778. ; sub.w d3,d0    ; second approx
  779. ; bgt .stillnot02
  780. ; move.w #1,d0
  781. ;.stillnot02
  782. ;
  783. ; move.w d0,movespd
  784. ;.moving
  785. ; ext.l d0
  786. ; asl.l #5,d0
  787. ; move.l d0,largespd
  788.  
  789. *****************************************************
  790. * FIND ROOM WE'RE STANDING IN ***********************
  791. *****************************************************
  792.  
  793.  move.l a5,a0
  794.  adda.w ToExitList(a5),a0
  795.  
  796.  move.l FloorLines,a1
  797. CheckMoreFloorLines
  798.  move.w (a0)+,d0    ; Either a floor line or -1
  799.  blt NoMoreFloorLines
  800.  asl.w #4,d0
  801.  lea (a1,d0.w),a2
  802.  
  803.  tst.w 8(a2)
  804.  blt.s CheckMoreFloorLines
  805.  
  806.  clr.b CrossIntoTop
  807.  
  808.  moveq #0,d1
  809.  move.w 8(a2),d1
  810.  move.l ZoneAdds,a4
  811.  move.l (a4,d1.w*4),a4
  812.  add.l LEVELDATA,a4
  813.  
  814.  move.l ToZoneRoof(a4),LowerRoofHeight
  815.  
  816. ; move.l newy,d0
  817. ; move.l d0,d1
  818. ; add.l thingheight,d1
  819. ;
  820. ; sub.l ToZoneRoof(a4),d0
  821. ; blt.s NOTINLOWER
  822. ; sub.l ToZoneFloor(a4),d1
  823. ; blt.s okthebottom
  824. ;
  825. ; cmp.l StepUpVal,d1
  826. ; bgt.s NOTINLOWER
  827. ;
  828. ; move.l ToZoneFloor(a4),d1
  829. ; sub.l thingheight,d1
  830. ; move.l d1,newy
  831. ; bra okthebottom
  832. ;
  833. ;NOTINLOWER:
  834. ;
  835. ; move.l ToZoneRoof(a4),billy
  836. ; move.l ToZoneRoof(a4),billy+4
  837. ; add.l d0,billy+4
  838. ;
  839. ; st CrossIntoTop
  840. ; move.l newy,d0
  841. ; move.l d0,d1
  842. ; add.l thingheight,d1
  843. ; sub.l ToUpperRoof(a4),d0
  844. ; blt CheckMoreFloorLines
  845. ; sub.l ToUpperFloor(a4),d1
  846. ; blt.s okthebottom
  847. ;
  848. ; cmp.l StepUpVal,d1
  849. ; bgt CheckMoreFloorLines
  850.  
  851. ; move.l ToUpperFloor(a4),d1
  852. ; sub.l thingheight,d1
  853. ; move.l d1,newy
  854.  
  855. okthebottom
  856.  
  857.  move.w newx,d0
  858.  move.w newz,d1
  859.  sub.w (a2),d0    ;a
  860.  sub.w 2(a2),d1    ;b
  861.  muls 4(a2),d1
  862.  muls 6(a2),d0
  863.  moveq #0,d3
  864.  move.w 8(a2),d3
  865.  move.l ZoneAdds,a3
  866.  move.l (a3,d3.w*4),a3
  867.  add.l LEVELDATA,a3
  868.  sub.l d1,d0
  869.  bge StillSameSide
  870.  
  871. * Player is now on the left side of this line.
  872. * Where was he before?
  873.  
  874. ; cmp.l a4,a5
  875. ; bne StillSameSide
  876.  
  877. ; move.w oldx,d0
  878. ; move.w oldz,d1
  879. ; sub.w (a2),d0    ;a
  880. ; sub.w 2(a2),d1    ;b
  881. ; muls 4(a2),d1
  882. ; muls 6(a2),d0
  883. ; sub.l d1,d0
  884. ; blt StillSameSide
  885. ; bra checkifcrossed
  886.  
  887. OnRightsideofline:
  888. * Player is now on the right side of the line.
  889. * Where was he last time?
  890.  
  891. ; exg a3,a4
  892.  
  893. ; cmp.l a3,a5
  894. ; bne StillSameSide
  895.  
  896. ; move.w oldx,d0
  897. ; move.w oldz,d1
  898. ; sub.w (a2),d0    ;a
  899. ; sub.w 2(a2),d1    ;b
  900. ; muls 4(a2),d1
  901. ; muls 6(a2),d0
  902. ; sub.l d1,d0
  903. ; bgt StillSameSide
  904.  
  905. checkifcrossed:
  906.  
  907. *Player used to be on other side of this line.
  908. *Need to check if he crossed it.
  909.  
  910.  move.l d0,billy
  911.  
  912.  move.w newx,d6
  913.  move.w newz,d7
  914.  sub.w oldx,d6
  915.  sub.w oldz,d7
  916.   
  917.  move.w (a2),d4
  918.  sub.w oldx,d4
  919.  muls d4,d7; negative if on left
  920.  move.w 2(a2),d4
  921.  sub.w oldz,d4
  922.  muls d4,d6
  923.  sub.l d6,d7
  924.  bgt StillSameSide
  925.  
  926.  move.w d0,d6
  927.  move.w d1,d7
  928.  move.w newx,d6
  929.  move.w newz,d7
  930.  sub.w oldx,d6
  931.  sub.w oldz,d7
  932.  
  933.  move.w (a2),d4
  934.  add.w 4(a2),d4
  935.  sub.w oldx,d4
  936.  muls d4,d7; negative if on left
  937.  move.w 2(a2),d4
  938.  add.w 6(a2),d4
  939.  sub.w oldz,d4
  940.  muls d4,d6
  941.  sub.l d6,d7
  942.  blt StillSameSide
  943.  
  944. ; Find height at crossing point:
  945.  
  946.  move.l billy,d7
  947.  divs 10(a2),d7
  948.  move.w oldx,d0
  949.  move.w oldz,d1
  950.  sub.w (a2),d0
  951.  sub.w 2(a2),d1
  952.  sub.w a4,d0
  953.  sub.w a6,d1
  954.  
  955.  muls 4(a2),d1
  956.  muls 6(a2),d0
  957.  sub.l d1,d0
  958.  divs 10(a2),d0 
  959.  
  960.  sub.w d7,d0
  961.  bgt.s .ohbugger
  962.  moveq #1,d0
  963. .ohbugger:
  964.  
  965.  
  966.  move.l newy,d4
  967.  sub.l oldy,d4
  968.  divs d0,d4
  969.  muls d7,d4
  970.  add.l newy,d4
  971.  
  972.  cmp.l LowerRoofHeight,d4
  973.  slt StoodInTop
  974.  
  975.  move.l a3,a5
  976.  move.l RoomPathPtr,a0
  977.  move.w (a3),(a0)+
  978.  move.l a0,RoomPathPtr
  979.  move.l a3,a0
  980.  move.l a5,objroom
  981.  
  982.  move.w QUITOUT,d0
  983.  sub.w #1,d0
  984.  beq.s ERRORINMOVEMENT
  985.  move.w d0,QUITOUT
  986.  bra gobackanddoitallagain
  987. ; bra.s donefloorline
  988.  
  989. StillSameSide:
  990. donefloorline:
  991.  
  992.  bra CheckMoreFloorLines
  993. NoMoreFloorLines:
  994.  
  995.  move.l a5,a0
  996.  move.l a5,objroom
  997.  
  998. mustbeinsameroom:
  999.  
  1000. stopandleave:
  1001.  
  1002.  move.l RoomPathPtr,a0
  1003.  move.w #-1,(a0)+
  1004.  
  1005.  rts
  1006.  
  1007. ERRORINMOVEMENT:
  1008.  move.w oldx,newx
  1009.  move.w oldz,newz
  1010.  move.l oldy,newy
  1011.  move.l objroomback,objroom
  1012.  rts
  1013.  
  1014. objroomback: dc.l 0
  1015.  
  1016. DX: dc.w 0
  1017.  
  1018. tstxval: dc.l 0
  1019. oldx: dc.l 0
  1020. oldz: dc.l 0
  1021. newx: dc.l 0
  1022. newz: dc.l 0
  1023. xdiff: dc.l 0
  1024. zdiff: dc.l 0
  1025. objroom: dc.l 0
  1026. hitwall: dc.b 0
  1027. exitfirst: dc.b 0
  1028. speed: dc.w 0
  1029. wallflags: dc.w 0
  1030. distaway: dc.w 0
  1031. newy: dc.l 0
  1032. oldy: dc.l 0
  1033. thingheight: dc.l 0
  1034. StepUpVal: dc.l 0
  1035. StepDownVal: dc.l 0
  1036. wallhitheight: dc.l 0
  1037. seclot: dc.b 0
  1038.  
  1039.  even
  1040. WALLXLEN: dc.w 0
  1041. WALLZLEN: dc.w 0
  1042. onwallx: dc.w 0
  1043. onwallz: dc.w 0
  1044. slidex: dc.w 0
  1045. slidez: dc.w 0
  1046. CrossIntoTop: dc.b 0
  1047. StoodInTop: dc.b 0
  1048. LowerFloorHeight: dc.l 0
  1049. LowerRoofHeight: dc.l 0
  1050. UpperFloorHeight: dc.l 0
  1051. UpperRoofHeight: dc.l 0
  1052.  
  1053. billy: dc.l 0,0
  1054.  
  1055.  even
  1056.  
  1057. HeadTowards:
  1058.  
  1059.  move.w newx,d1
  1060.  sub.w oldx,d1
  1061.  move.w d1,xdiff
  1062.  move.w newz,d2
  1063.  sub.w oldz,d2
  1064.  move.w d2,zdiff
  1065.  muls d1,d1
  1066.  muls d2,d2
  1067.  move.w #0,d0
  1068.  move.w d0,distaway
  1069.  add.l d1,d2
  1070.  beq nochange
  1071.  
  1072.  move.w #31,d0
  1073. .findhigh
  1074.  btst d0,d2
  1075.  bne .foundhigh
  1076.  dbra d0,.findhigh
  1077. .foundhigh
  1078.  asr.w #1,d0
  1079.  clr.l d3
  1080.  bset d0,d3
  1081.  move.l d3,d0
  1082.  
  1083.  move.w d0,d1
  1084.  muls d1,d1    ; x*x
  1085.  sub.l d2,d1    ; x*x-a
  1086.  asr.l #1,d1    ; (x*x-a)/2
  1087.  divs d0,d1    ; (x*x-a)/2x
  1088.  sub.w d1,d0    ; second approx
  1089.  bgt .stillnot0
  1090.  move.w #1,d0
  1091. .stillnot0
  1092.  
  1093.  move.w d0,d1
  1094.  muls d1,d1
  1095.  sub.l d2,d1
  1096.  asr.l #1,d1
  1097.  divs d0,d1
  1098.  sub.w d1,d0    ; second approx
  1099.  bgt .stillnot02
  1100.  move.w #1,d0
  1101. .stillnot02
  1102.  
  1103.  move.w d0,distaway
  1104.  
  1105. ; d0=perpdist
  1106.  
  1107.  cmp.w Range,d0
  1108.  sle GotThere
  1109.  bgt.s faraway
  1110.  
  1111.  move.w xdiff,d1
  1112.  move.w zdiff,d2
  1113.  muls Range,d1
  1114.  muls Range,d2
  1115.  divs d0,d1
  1116.  divs d0,d2
  1117.  neg.w d1
  1118.  neg.w d2
  1119.  add.w d1,newx
  1120.  add.w d2,newz
  1121.  bra nochange
  1122.  
  1123. faraway:
  1124.  move.w speed,d3
  1125.  add.w Range,d3
  1126.  cmp.w d0,d3
  1127.  blt.s .notoofast
  1128.  move.w d0,d3
  1129.  st GotThere
  1130. .notoofast:
  1131.  sub.w Range,d3
  1132.  
  1133.  move.w xdiff,d1
  1134.  muls d3,d1
  1135.  divs d0,d1
  1136.  move.w zdiff,d2
  1137.  muls d3,d2
  1138.  divs d0,d2
  1139.  add.w oldx,d1
  1140.  move.w d1,newx
  1141.  add.w oldz,d2
  1142.  move.w d2,newz
  1143.  
  1144. nochange:
  1145.  
  1146.  rts
  1147.  
  1148.  
  1149. CalcDist:
  1150.  
  1151.  move.w newx,d1
  1152.  sub.w oldx,d1
  1153.  move.w d1,xdiff
  1154.  move.w newz,d2
  1155.  sub.w oldz,d2
  1156.  move.w d2,zdiff
  1157.  muls d1,d1
  1158.  muls d2,d2
  1159.  move.w #0,d0
  1160.  move.w d0,distaway
  1161.  add.l d1,d2
  1162.  beq .nochange
  1163.  
  1164.  move.w #31,d0
  1165. .findhigh
  1166.  btst d0,d2
  1167.  bne .foundhigh
  1168.  dbra d0,.findhigh
  1169. .foundhigh
  1170.  asr.w #1,d0
  1171.  clr.l d3
  1172.  bset d0,d3
  1173.  move.l d3,d0
  1174.  
  1175.  move.w d0,d1
  1176.  muls d1,d1    ; x*x
  1177.  sub.l d2,d1    ; x*x-a
  1178.  asr.l #1,d1    ; (x*x-a)/2
  1179.  divs d0,d1    ; (x*x-a)/2x
  1180.  sub.w d1,d0    ; second approx
  1181.  bgt .stillnot0
  1182.  move.w #1,d0
  1183. .stillnot0
  1184.  
  1185.  move.w d0,d1
  1186.  muls d1,d1
  1187.  sub.l d2,d1
  1188.  asr.l #1,d1
  1189.  divs d0,d1
  1190.  sub.w d1,d0    ; second approx
  1191.  bgt .stillnot02
  1192.  move.w #1,d0
  1193. .stillnot02
  1194.  
  1195.  move.w d0,distaway
  1196. .nochange:
  1197.  
  1198.  rts
  1199.  
  1200.  
  1201. counterer: dc.w 0
  1202. CosRet: dc.w 0
  1203. SinRet: dc.w 0
  1204.  
  1205. HeadTowardsAng:
  1206.  
  1207.  move.w newx,d1
  1208.  sub.w oldx,d1
  1209.  move.w d1,xdiff
  1210.  move.w newz,d2
  1211.  sub.w oldz,d2
  1212.  move.w d2,zdiff
  1213.  muls d1,d1
  1214.  muls d2,d2
  1215.  move.w #0,d0
  1216.  add.l d1,d2
  1217.  seq GotThere
  1218.  beq .nochange
  1219.  
  1220.  move.w #31,d0
  1221. .findhigh
  1222.  btst d0,d2
  1223.  bne .foundhigh
  1224.  dbra d0,.findhigh
  1225. .foundhigh
  1226.  asr.w #1,d0
  1227.  clr.l d3
  1228.  bset d0,d3
  1229.  move.l d3,d0
  1230.  
  1231.  move.w d0,d1
  1232.  muls d1,d1    ; x*x
  1233.  sub.l d2,d1    ; x*x-a
  1234.  asr.l #1,d1    ; (x*x-a)/2
  1235.  divs d0,d1    ; (x*x-a)/2x
  1236.  sub.w d1,d0    ; second approx
  1237.  bgt .stillnot0
  1238.  move.w #1,d0
  1239. .stillnot0
  1240.  
  1241.  move.w d0,d1
  1242.  muls d1,d1
  1243.  sub.l d2,d1
  1244.  asr.l #1,d1
  1245.  divs d0,d1
  1246.  sub.w d1,d0    ; second approx
  1247.  bgt .stillnot02
  1248.  move.w #1,d0
  1249. .stillnot02
  1250.  
  1251.  move.w d0,d1
  1252.  muls d1,d1
  1253.  sub.l d2,d1
  1254.  asr.l #1,d1
  1255.  divs d0,d1
  1256.  sub.w d1,d0    ; second approx
  1257.  bgt .stillnot03
  1258.  move.w #1,d0
  1259. .stillnot03
  1260.  
  1261.  
  1262. ; d0=perpdist
  1263.  
  1264.  cmp.w Range,d0
  1265.  sle GotThere
  1266.  bgt .faraway
  1267.  
  1268.  move.w oldx,newx
  1269.  move.w oldz,newz
  1270.  bra .nochange
  1271.  
  1272.  move.w xdiff,d1
  1273.  move.w zdiff,d2
  1274.  muls Range,d1
  1275.  muls Range,d2
  1276.  addq #3,d0
  1277.  divs d0,d1
  1278.  divs d0,d2
  1279.  subq #3,d0
  1280.  neg.w d1
  1281.  neg.w d2
  1282.  add.w d1,newx
  1283.  add.w d2,newz
  1284.  tst.b canshove
  1285.  beq .nochange
  1286.  move.w PLR1_opushx(pc),d1
  1287.  add.w PLR2_opushx(pc),d1
  1288.  sub.w d1,newx
  1289.  move.w PLR1_opushz(pc),d1
  1290.  add.w PLR2_opushz(pc),d1
  1291.  sub.w d1,newz
  1292.  move.w xdiff,d1
  1293.  move.w zdiff,d2
  1294.  move.w Range,d3
  1295.  sub.w d0,d3
  1296.  muls d3,d1
  1297.  muls d3,d2
  1298.  divs d0,d1
  1299.  divs d0,d2
  1300.  move.w d1,shovex
  1301.  move.w d2,shovez
  1302.  bra .nochange
  1303.  
  1304. .faraway:
  1305.  
  1306.  move.w speed,d3
  1307.  add.w Range,d3
  1308.  cmp.w d0,d3
  1309.  blt.s .notoofast
  1310.  move.w d0,d3
  1311.  st GotThere
  1312. .notoofast:
  1313.  sub.w Range,d3
  1314.  
  1315.  move.w xdiff,d1
  1316.  muls d3,d1
  1317.  divs d0,d1
  1318.  move.w zdiff,d2
  1319.  muls d3,d2
  1320.  divs d0,d2
  1321.  add.w oldx,d1
  1322.  move.w d1,newx
  1323.  add.w oldz,d2
  1324.  move.w d2,newz
  1325.  
  1326. .nochange:
  1327.  
  1328.  tst.w d0
  1329.  beq.s nocossin
  1330.  
  1331.  add.w #1,d0
  1332.  move.w xdiff,d1
  1333.  swap d1
  1334.  clr.w d1
  1335.  asr.l #1,d1
  1336.  divs d0,d1
  1337.  move.w d1,SinRet
  1338.  move.w zdiff,d1
  1339.  swap d1
  1340.  clr.w d1
  1341.  asr.l #1,d1
  1342.  divs d0,d1
  1343.  move.w d1,CosRet
  1344.  
  1345.  move.w SinRet,d0
  1346.  move.w #0,d2
  1347.  move.l #SineTable,a2
  1348.  lea 2048(a2),a3
  1349.  move.w #3,d5
  1350.  move.w #2048,d6
  1351. findanglop:
  1352.  
  1353.  move.w (a2,d2.w*2),d3
  1354.  move.w (a3,d2.w*2),d4
  1355.  muls d0,d4
  1356.  muls d1,d3
  1357.  sub.l d3,d4
  1358.  blt.s subang
  1359.  add.w d6,d2
  1360.  add.w d6,d2
  1361. subang:
  1362.  sub.w d6,d2
  1363.  and.w #4095,d2
  1364.  asr.w #1,d6
  1365.  dbra d5,findanglop
  1366.  add.w d2,d2
  1367.  move.w d2,AngRet
  1368.  
  1369. nocossin:
  1370.  
  1371.  rts
  1372.  
  1373. AngRet: dc.w 0
  1374. Range: dc.w 0
  1375. GotThere: dc.w 0
  1376. shovex: dc.w 0
  1377. shovez: dc.w 0
  1378. canshove: dc.w 0
  1379. PLR2_pushx: dc.l 0
  1380. PLR2_pushz: dc.l 0
  1381. PLR2_opushx: dc.l 0
  1382. PLR2_opushz: dc.l 0
  1383. PLR1_pushx: dc.l 0
  1384. PLR1_pushz: dc.l 0
  1385. PLR1_opushx: dc.l 0
  1386. PLR1_opushz: dc.l 0
  1387.  
  1388. CheckHit:
  1389.  move.w newx,d0
  1390.  sub.w oldx,d0
  1391.  move.w newz,d1
  1392.  sub.w oldz,d1
  1393.  muls d1,d1
  1394.  muls d0,d0
  1395.  add.l d0,d1
  1396.  cmp.l d2,d1
  1397.  slt hitwall
  1398.  rts
  1399.  
  1400. GetNextCPt:
  1401.  cmp.w d0,d1
  1402.  beq.s noneedforhassle
  1403.  muls #100,d0
  1404.  ext.l d1
  1405.  add.l d1,d0
  1406.  move.l a0,-(a7)
  1407.  lea ControlPts,a0
  1408.  move.b (a0,d0.w),d0
  1409.  ext.w d0
  1410.  move.l (a7)+,a0
  1411. noneedforhassle:
  1412.  rts
  1413.  
  1414. FromRoom: dc.l 0
  1415. ToRoom: dc.l 0
  1416. CanSee: dc.w 0
  1417. Facedir: dc.w 0
  1418.  
  1419.  even
  1420.  
  1421. CanItBeSeenAng:
  1422.  movem.l d0-d7/a0-a6,-(a7)
  1423.  
  1424.  move.w Facedir,d0
  1425.  move.l #SineTable,a0
  1426.  add.w d0,a0
  1427.  move.w (a0),d0
  1428.  move.w 2048(a0),d1
  1429.  move.w Targetx,d2
  1430.  sub.w Viewerx,d2
  1431.  move.w Targetz,d3
  1432.  sub.w Viewerz,d3
  1433.  muls d1,d2
  1434.  muls d0,d3
  1435.  sub.l d3,d2
  1436.  bgt.s ItMightBeSeen
  1437.  clr.b CanSee
  1438.  movem.l (a7)+,d0-a7/a0-a6
  1439.  rts
  1440. ItMightBeSeen:
  1441.  
  1442.  move.l ToRoom,a0
  1443.  move.w (a0),d0
  1444.  move.l FromRoom,a0
  1445.  adda.w #ToListOfGraph,a0
  1446.  bra.s InList
  1447.  
  1448. Viewerx: dc.l 0
  1449. Viewerz: dc.l 0
  1450. Targetx: dc.l 0
  1451. Targetz: dc.l 0
  1452. ViewerTop: dc.b 0
  1453. TargetTop: dc.b 0 
  1454. Viewery: dc.w 0
  1455. Targety: dc.w 0
  1456.  
  1457.   even
  1458.  
  1459. insameroom:
  1460.  st CanSee
  1461.  move.b ViewerTop,d0
  1462.  move.b TargetTop,d1
  1463.  eor.b d0,d1
  1464.  bne outlist
  1465.  movem.l (a7)+,d0-d7/a0-a6
  1466.  rts
  1467.  
  1468. CanItBeSeen:
  1469.  
  1470.  movem.l d0-d7/a0-a6,-(a7)
  1471.  move.l ToRoom,a1
  1472.  move.w (a1),d0
  1473.  move.l FromRoom,a0
  1474.  cmp.l a0,a1
  1475.  beq.s insameroom
  1476.  
  1477.  adda.w #ToListOfGraph,a0
  1478.  
  1479. InList:
  1480.  move.w (a0),d1
  1481.  tst.w d1
  1482.  blt outlist
  1483.  move.l ZoneGraphAdds,a1
  1484.  move.l (a1,d1.w*8),a1
  1485.  add.l LEVELGRAPHICS,a1
  1486.  
  1487.  adda.w #8,a0
  1488.  cmp.w (a1),d0
  1489.  beq isinlist
  1490.  
  1491.  bra.s InList
  1492.  
  1493. isinlist:
  1494. ; We have found the dest room in the
  1495. ; list of rooms visible from the
  1496. ; source room.
  1497.  
  1498. ; Do line of sight!
  1499.  
  1500.  st CanSee
  1501.  
  1502.  move.l Points,a2
  1503.  move.w Targetx,d1
  1504.  move.w Targetz,d2
  1505.  sub.w Viewerx,d1
  1506.  sub.w Viewerz,d2
  1507.  
  1508.  moveq #0,d3
  1509.  move.w -6(a0),d3
  1510.  blt nomorerclips
  1511.  move.l LEVELCLIPS,a1
  1512.  lea (a1,d3.l*2),a1
  1513.  move.l a1,clipstocheck
  1514. checklcliploop:
  1515.  tst.w (a1)
  1516.  blt nomorelclips
  1517.  
  1518.  move.w (a1),d0
  1519.  blt.s noleftone
  1520.  move.l (a2,d0.w*4),d3
  1521.  move.w d3,d4
  1522.  sub.w Viewerz,d4
  1523.  swap d3
  1524.  sub.w Viewerx,d3
  1525.  muls d2,d3
  1526.  muls d1,d4
  1527.  sub.l d3,d4
  1528.  ble outlist
  1529.  
  1530. noleftone:
  1531.  
  1532.  addq #2,a1
  1533.  
  1534.  bra checklcliploop
  1535.  
  1536. nomorelclips:
  1537.  
  1538.  addq #2,a1
  1539.  
  1540. checkrcliploop:
  1541.  tst.w (a1)
  1542.  blt nomorerclips
  1543.  
  1544.  move.w (a1),d0
  1545.  blt.s norightone
  1546.  move.l (a2,d0.w*4),d3
  1547.  move.w d3,d4
  1548.  sub.w Viewerz,d4
  1549.  swap d3
  1550.  sub.w Viewerx,d3
  1551.  muls d2,d3
  1552.  muls d1,d4
  1553.  sub.l d3,d4
  1554.  bge outlist
  1555.  
  1556. norightone:
  1557.  addq #2,a1
  1558.  
  1559.  bra checkrcliploop
  1560.  
  1561.  
  1562. nomorerclips:
  1563.  
  1564. ; No clipping points in the way; got to do the
  1565. ; vertical working out now.
  1566.  
  1567.  move.w Targetx,d0
  1568.  move.w Targetz,d1
  1569.  sub.w Viewerx,d0
  1570.  sub.w Viewerz,d1
  1571.  move.l FromRoom,a5
  1572.  move.l FloorLines,a1
  1573.  move.b ViewerTop,d2
  1574.  move.w Targety,d7
  1575.  sub.w Viewery,d7
  1576.  
  1577.  
  1578. GoThroughZones:
  1579.  move.l a5,a0
  1580.  adda.w ToExitList(a0),a0
  1581.  
  1582. FindWayOut:
  1583.  move.w (a0)+,d5
  1584.  blt outlist
  1585.  asl.w #4,d5
  1586.  lea (a1,d5.w),a2
  1587.  
  1588.  move.w (a2),d3
  1589.  move.w 2(a2),d4
  1590.  sub.w Viewerx,d3
  1591.  sub.w Viewerz,d4
  1592.  move.w d3,d5
  1593.  move.w d4,d6
  1594.  muls d1,d3
  1595.  muls d0,d4
  1596.  sub.l d3,d4
  1597.  ble FindWayOut
  1598.  
  1599.  add.w 4(a2),d5
  1600.  add.w 6(a2),d6
  1601.  muls d0,d6
  1602.  muls d1,d5
  1603.  sub.l d5,d6
  1604.  bge FindWayOut
  1605.  
  1606.  tst.w 8(a2)
  1607.  blt outlist
  1608.  
  1609. ; Here is the exit from the room. Calculate the height at which
  1610. ; we meet it.
  1611.  
  1612.  move.w Targetx,d3
  1613.  move.w Targetz,d4
  1614.  sub.w (a2),d3
  1615.  sub.w 2(a2),d4
  1616.  muls 4(a2),d4
  1617.  muls 6(a2),d3
  1618.  sub.l d3,d4    ; positive
  1619.  
  1620.  move.w Viewerx,d5
  1621.  move.w Viewerz,d6
  1622.  sub.w (a2),d5
  1623.  sub.w 2(a2),d6
  1624.  muls 4(a2),d6
  1625.  muls 6(a2),d5
  1626.  sub.l d6,d5    ; positive
  1627.  
  1628.  divs 10(a2),d4
  1629.  divs 10(a2),d5
  1630.  
  1631.  add.w d5,d4
  1632.  beq.s sameheight
  1633.  muls d7,d5
  1634.  divs d4,d5
  1635. sameheight:
  1636.  add.w Viewery,d5    ; height at which we cross wall
  1637.  
  1638.  ext.l d5
  1639.  asl.l #7,d5
  1640.  
  1641.  tst.b d2
  1642.  beq.s comparewithbottom
  1643.  
  1644.  cmp.l ToUpperRoof(a5),d5
  1645.  blt outlist
  1646.  cmp.l ToUpperFloor(a5),d5
  1647.  bgt outlist
  1648.  bra.s madeit
  1649.  
  1650. comparewithbottom:
  1651.  cmp.l ToZoneRoof(a5),d5
  1652.  blt outlist
  1653.  cmp.l ToZoneFloor(a5),d5
  1654.  bgt outlist
  1655. madeit:
  1656.  st donessomething
  1657.  
  1658.  moveq #0,d3
  1659.  move.w 8(a2),d3
  1660.  move.l ZoneAdds,a3
  1661.  move.l (a3,d3.w*4),a5
  1662.  add.l LEVELDATA,a5
  1663.  
  1664.  clr.b d2
  1665.  cmp.l ToZoneFloor(a5),d5
  1666.  bgt outlist
  1667.  cmp.l ToZoneRoof(a5),d5
  1668.  bgt.s GotIn
  1669.  st d2
  1670.  cmp.l ToUpperFloor(a5),d5
  1671.  bgt outlist
  1672.  cmp.l ToUpperRoof(a5),d5
  1673.  blt outlist
  1674.  
  1675. GotIn:
  1676.  
  1677.  cmp.l ToRoom,a5
  1678.  bne GoThroughZones
  1679.  
  1680.  move.b TargetTop,d3
  1681.  eor.b d2,d3
  1682.  bne outlist
  1683.  
  1684.  movem.l (a7)+,d0-d7/a0-a6
  1685.  rts
  1686.  
  1687. clipstocheck: dc.l 0
  1688. donessomething: dc.w 0
  1689.  
  1690. outlist:
  1691.  clr.b CanSee
  1692.  movem.l (a7)+,d0-d7/a0-a6
  1693.  rts
  1694.  
  1695.  
  1696. FindCollisionPt:
  1697.  movem.l d0-a7/a0-a6,-(a7)
  1698.  
  1699.  move.w Targetx,d0
  1700.  move.w Targetz,d1
  1701.  sub.w Viewerx,d0
  1702.  sub.w Viewerz,d1
  1703.  move.l FromRoom,a5
  1704.  move.l FloorLines,a1
  1705.  move.b ViewerTop,d2
  1706.  move.w Targety,d7
  1707.  sub.w Viewery,d7
  1708.  
  1709.  
  1710. .GoThroughZones:
  1711.  move.l a5,a0
  1712.  adda.w ToExitList(a0),a0
  1713.  
  1714. .FindWayOut:
  1715.  move.w (a0)+,d5
  1716.  blt outlist
  1717.  asl.w #4,d5
  1718.  lea (a1,d5.w),a2
  1719.  
  1720.  move.w (a2),d3
  1721.  move.w 2(a2),d4
  1722.  sub.w Viewerx,d3
  1723.  sub.w Viewerz,d4
  1724.  move.w d3,d5
  1725.  move.w d4,d6
  1726.  muls d1,d3
  1727.  muls d0,d4
  1728.  sub.l d3,d4
  1729.  ble .FindWayOut
  1730.  
  1731.  add.w 4(a2),d5
  1732.  add.w 6(a2),d6
  1733.  muls d0,d6
  1734.  muls d1,d5
  1735.  sub.l d5,d6
  1736.  bge .FindWayOut
  1737.  
  1738.  
  1739. ; Here is the exit from the room. Calculate the height at which
  1740. ; we meet it.
  1741.  
  1742.  move.w Targetx,d3
  1743.  move.w Targetz,d4
  1744.  sub.w (a2),d3
  1745.  sub.w 2(a2),d4
  1746.  muls 4(a2),d4
  1747.  muls 6(a2),d3
  1748.  sub.l d3,d4    ; positive
  1749.  
  1750.  move.w Viewerx,d5
  1751.  move.w Viewerz,d6
  1752.  sub.w (a2),d5
  1753.  sub.w 2(a2),d6
  1754.  muls 4(a2),d6
  1755.  muls 6(a2),d5
  1756.  sub.l d6,d5    ; positive
  1757.  
  1758.  divs 10(a2),d4
  1759.  divs 10(a2),d5
  1760.  
  1761.  move.w d5,d6
  1762.  add.w d5,d4
  1763.  beq.s .sameheight
  1764.  muls d7,d5
  1765.  divs d4,d5
  1766. .sameheight:
  1767.  add.w Viewery,d5    ; height at which we cross wall
  1768.  
  1769.  ext.l d5
  1770.  asl.l #7,d5
  1771.  
  1772.  moveq #0,d3
  1773.  move.w 8(a2),d3
  1774.  blt foundpt
  1775.  move.l ZoneAdds,a3
  1776.  move.l (a3,d3.w*4),a5
  1777.  add.l LEVELDATA,a5
  1778.  
  1779.  clr.b d2
  1780.  cmp.l ToZoneFloor(a5),d5
  1781.  bgt foundpt
  1782.  cmp.l ToZoneRoof(a5),d5
  1783.  bgt.s .GotIn
  1784.  st d2
  1785.  cmp.l ToUpperFloor(a5),d5
  1786.  bgt foundpt
  1787.  cmp.l ToUpperRoof(a5),d5
  1788.  blt foundpt
  1789.  
  1790. .GotIn:
  1791.  
  1792.  bra .GoThroughZones
  1793.  
  1794.  tst.w d4
  1795.  beq.s foundpt
  1796.  muls d6,d0
  1797.  divs d4,d0
  1798.  muls d6,d1
  1799.  divs d4,d1
  1800.  add.w Viewerx,d0
  1801.  add.w Viewerz,d1
  1802.  move.w d0,Targetx
  1803.  move.w d1,Targetz
  1804.  move.l d5,Targety
  1805.  
  1806. foundpt:
  1807.  
  1808.  movem.l (a7)+,d0-a7/a0-a6
  1809.  rts
  1810.  
  1811. GetRand:
  1812.  move.w Rand1,d0
  1813.  add.w #29,d0
  1814.  eor.w #$5f37,d0
  1815.  neg.w d0
  1816.  rol.w #5,d0
  1817.  move.w d0,Rand1
  1818.  rts
  1819.  
  1820. Rand1: dc.w 234
  1821.  
  1822. GoInDirection:
  1823.  move.l #SineTable,a0
  1824.  lea (a0,d0.w),a0
  1825.  move.w (a0),d1
  1826.  move.w 2048(a0),d2
  1827.  muls speed,d1
  1828.  add.l d1,d1
  1829.  muls speed,d2
  1830.  add.l d2,d2
  1831.  swap d1
  1832.  swap d2
  1833.  add.w oldx,d1
  1834.  add.w oldz,d2
  1835.  move.w d1,newx
  1836.  move.w d2,newz
  1837.  rts
  1838.  
  1839. CollideFlags: dc.l 0
  1840.  
  1841. Collision:
  1842.  
  1843.  move.l ObjectData,a0
  1844.  move.w CollId,d0
  1845.  asl.w #6,d0
  1846.  move.b 16(a0,d0.w),d0
  1847.  ext.w d0
  1848.  
  1849.  sub.w #64,a0
  1850.  move.l ObjectPoints,a1
  1851.  move.l #ColBoxTable,a2
  1852.  lea  (a2,d0.w*8),a3
  1853.  
  1854.  move.l CollideFlags,d7
  1855.  move.b StoodInTop,d6
  1856.  move.l newy,d4
  1857.  move.l d4,d5
  1858.  add.l thingheight,d5
  1859.  asr.l #7,d4
  1860.  asr.l #7,d5
  1861.  clr.b hitwall
  1862.  
  1863. checkcol:
  1864.  add.w #64,a0
  1865.  
  1866.  move.w (a0),d0
  1867.  blt checkedallcol
  1868.  
  1869.  cmp.w CollId,d0
  1870.  beq.s checkcol
  1871.  
  1872.  tst.w 12(a0)
  1873.  blt.s checkcol
  1874.  
  1875.  tst.b numlives(a0)
  1876.  beq.s checkcol
  1877.  
  1878.  move.b ObjInTop(a0),d1
  1879.  eor.b d6,d1
  1880.  bne checkcol
  1881.  
  1882.  moveq #0,d3
  1883.  move.b 16(a0),d3
  1884.  blt checkcol
  1885.  
  1886.  btst d3,d7
  1887.  beq checkcol
  1888.  
  1889.  move.w 4(a0),d1
  1890.  sub.w 2(a2,d3.w*8),d1
  1891.  cmp.w d1,d5
  1892.  blt checkcol
  1893.  add.w 4(a2,d3.w*8),d1
  1894.  cmp.w d1,d4
  1895.  bgt checkcol
  1896.  
  1897.  move.w (a1,d0.w*8),d1
  1898.  move.w 4(a1,d0.w*8),d2
  1899.  sub.w newx,d1
  1900.  bge.s .xnoneg
  1901.  neg.w d1
  1902. .xnoneg:
  1903.  sub.w newz,d2
  1904.  bge.s .znoneg
  1905.  neg.w d2
  1906. .znoneg:
  1907.  cmp.w d1,d2
  1908.  ble.s .checkx
  1909.  sub.w (a3),d2
  1910.  cmp.w (a2,d3.w*8),d2
  1911.  bgt checkcol
  1912.  st hitwall
  1913.  bra checkedallcol
  1914. .checkx:
  1915.  sub.w (a3),d1
  1916.  cmp.w (a2,d3.w*8),d1
  1917.  bgt checkcol
  1918.  
  1919.  move.w (a1,d0.w*8),d1
  1920.  move.w 4(a1,d0.w*8),d2
  1921.  move.w d1,d6
  1922.  move.w d2,d7
  1923.  sub.w newx,d6
  1924.  sub.w newz,d7
  1925.  muls d6,d6
  1926.  muls d7,d7
  1927.  add.l d6,d7
  1928.  sub.w oldx,d1
  1929.  sub.w oldz,d2
  1930.  muls d1,d1
  1931.  muls d2,d2
  1932.  add.l d1,d2
  1933.  cmp.l d2,d7
  1934.  bgt checkcol
  1935.  
  1936.  st hitwall
  1937.  bra checkedallcol
  1938.  
  1939. ; bra checkcol
  1940.  
  1941. checkedallcol:
  1942.  rts
  1943.  
  1944. ColBoxTable:
  1945.  
  1946. ; red scurrying alien
  1947.  dc.w 40,60,120,0
  1948. ; Medipack
  1949.  dc.w 40,20,40,0
  1950. ; Bullet
  1951.  dc.w 40,20,40,0
  1952. ; Gun
  1953.  dc.w 40,20,40,0
  1954. ; Key
  1955.  dc.w 40,20,40,0
  1956. ; PLayer1
  1957.  dc.w 40,40,80,0
  1958. ;Robot
  1959.  dc.w 40,50,100,0
  1960. ;?
  1961.  dc.w 40,20,40,0
  1962. ; Flying Nasty
  1963.  dc.w 80,60,120,0
  1964. ; Ammo
  1965.  dc.w 40,20,40,0
  1966. ; Barrel
  1967.  dc.w 40,30,60,0
  1968. ;PlAYER2
  1969.  dc.w 40,40,80,0
  1970. ; Mutant Marine
  1971.  dc.w 40,40,80,0
  1972. ; worm
  1973.  dc.w 80,60,120,0
  1974. ; huge red thing
  1975.  dc.w 160,100,200,0
  1976. ; small red thing
  1977.  dc.w 80,50,100,0
  1978. ; tree
  1979.  dc.w 80,60,120,0
  1980. ; eyeball
  1981.  dc.w 40,30,60,0
  1982. ; Tough Marine
  1983.  dc.w 40,40,80,0
  1984. ; ShotGun Marine
  1985.  dc.w 40,40,80,0
  1986.  
  1987. FromZone: dc.w 0
  1988. OKTEL: dc.w 0
  1989. floortemp: dc.l 0
  1990.  
  1991. CheckTeleport:
  1992.  clr.b OKTEL
  1993.  move.w FromZone,d0
  1994.  move.l ZoneAdds,a2
  1995.  move.l (a2,d0.w*4),a2
  1996.  add.l LEVELDATA,a2
  1997.  tst.w ToTelZone(a2)
  1998.  bge.s ITSATEL
  1999.  rts
  2000.  
  2001. ITSATEL:
  2002.  move.l ToZoneFloor(a2),floortemp
  2003.  move.w ToTelZone(a2),d0
  2004.  move.l ZoneAdds,a3
  2005.  move.l (a3,d0.w*4),a3
  2006.  add.l LEVELDATA,a3
  2007.  move.l ToZoneFloor(a3),d0
  2008.  sub.l floortemp,d0
  2009.  move.l d0,floortemp
  2010.  add.l d0,newy 
  2011.  move.w ToTelX(a2),newx
  2012.  move.w ToTelZ(a2),newz
  2013.  move.l #%1111111111111111111,CollideFlags
  2014.  movem.l a0/a1/a2,-(a7)
  2015.  bsr Collision
  2016.  movem.l (a7)+,a0/a1/a2
  2017.  
  2018.  move.l floortemp,d0
  2019.  sub.l d0,newy
  2020.  
  2021.  tst.b hitwall
  2022.  seq OKTEL
  2023.  beq.s .teleport
  2024.  rts
  2025. .teleport:
  2026.  move.w ToTelZone(a2),d0
  2027.  move.l ZoneAdds,a2
  2028.  move.l (a2,d0.w*4),a2
  2029.  add.l LEVELDATA,a2
  2030.  move.l a2,objroom
  2031.  
  2032.  rts
  2033.  
  2034. FindCloseRoom:
  2035.  ; d0 is distance.
  2036.  
  2037.  move.w 4(a0),d1
  2038.  ext.l d1
  2039.  asl.l #7,d1
  2040.  move.l d1,oldy
  2041.  move.l d1,newy
  2042.  
  2043.  move.w (a0),d1
  2044.  move.l ObjectPoints,a1
  2045.  lea (a1,d1.w*8),a1
  2046.  move.w (a1),oldx 
  2047.  move.w 4(a1),oldz
  2048.  
  2049.  move.w 12(a0),d2
  2050.  move.l ZoneAdds,a5
  2051.  move.l (a5,d2.w*4),d2
  2052.  add.l LEVELDATA,d2
  2053.  move.l d2,objroom
  2054.  
  2055.  move.w THISPLRxoff,newx
  2056.  move.w THISPLRzoff,newz
  2057.  move.w d0,speed
  2058.  movem.l a0/a1,-(a7)
  2059.  jsr HeadTowards
  2060.  movem.l (a7)+,a0/a1
  2061.  
  2062.  move.w newx,d0
  2063.  sub.w oldx,d0
  2064.  move.w oldz,d1
  2065.  sub.w newz,d1
  2066.  
  2067.  move.w d1,xd
  2068.  move.w d0,zd
  2069.  
  2070.  move.l #100000,StepUpVal
  2071.  move.l #100000,StepDownVal
  2072.  move.w #0,thingheight
  2073.  
  2074.  st exitfirst
  2075.  
  2076.  add.w oldx,d1
  2077.  add.w oldz,d0
  2078.  move.w d1,newx
  2079.  move.w d0,newz
  2080.  movem.l d0-d7/a0-a6,-(a7)
  2081.  clr.b wallbounce
  2082.  jsr MoveObject
  2083.  movem.l (a7)+,d0-d7/a0-a6
  2084.  
  2085.  move.l #RoomPath,a2
  2086.  move.l #possclose,a3
  2087.  move.w 12(a0),(a3)+
  2088.  
  2089. putinmore:
  2090.  move.w (a2)+,(a3)+
  2091.  bge.s putinmore
  2092.  subq #2,a3
  2093.  
  2094.  move.w oldx,d0
  2095.  sub.w xd,d0
  2096.  move.w oldz,d1
  2097.  sub.w zd,d1
  2098.  move.w d0,newx
  2099.  move.w d1,newz    
  2100.  
  2101.  movem.l d0-d7/a0-a6,-(a7)
  2102.  clr.b wallbounce
  2103.  jsr MoveObject
  2104.  movem.l (a7)+,d0-d7/a0-a6
  2105.  
  2106.  move.l #RoomPath,a2
  2107.  
  2108. putinmore2:
  2109.  move.w (a2)+,d0
  2110.  move.w d0,(a3)+
  2111.  tst.w d0
  2112.  bge.s putinmore2
  2113.  
  2114. ; ok a3 points at list of rooms passed through.
  2115.  move.w #-1,(a3)+
  2116.  
  2117.  
  2118.  move.w 12(a0),d7
  2119.  
  2120.  move.l endoflist,a3
  2121. FINDCLOSELOOP:
  2122.  move.l #possclose,a2
  2123.  move.w -(a3),d0
  2124.  blt foundclose
  2125.  
  2126. findinner
  2127.  move.w (a2)+,d1
  2128.  blt.s outin
  2129.  cmp.w d0,d1
  2130.  bne.s findinner
  2131.  move.w d0,d7
  2132. outin:
  2133.  
  2134.  bra.s FINDCLOSELOOP
  2135.  
  2136. foundclose:
  2137.  
  2138.  move.w d7,GraphicRoom(a0)
  2139.  
  2140.  rts
  2141.  
  2142. xd: dc.w 0
  2143. zd: dc.w 0
  2144.  
  2145. possclose:
  2146.  ds.w 100